#include <iostream>
#include <unistd.h>    // 提供Unix系统调用接口
#include <signal.h>    // 信号处理相关头文件
#include <sys/types.h> // 基本系统数据类型定义
#include <sys/wait.h>  // wait()函数相关定义

using namespace std;

int main()
{
    // 信号处理设置:
    // signal(2, SIG_IGN);  // 忽略SIGINT信号(Ctrl+C)
    signal(2, SIG_DFL);     // 使用SIGINT信号的默认处理方式

    // 无限循环打印
    while(1)
    {
        cout << "hello signal" << endl;
        sleep(1);    // 休眠1秒
    }

    /* 以下是被注释掉的除零错误测试代码
    int a = 10;
    int b = 0;
    a /= b;    // 会触发SIGFPE(浮点异常)信号
    cout << " a = " << a << endl;
    */

    /* 以下是被注释掉的父子进程通信代码
    pid_t id = fork();    // 创建子进程
    if(id == 0)          // 子进程代码段
    {
        //child
        int cnt = 500;
        while(cnt)
        {
            cout << "i am a child process, pid: " << getpid() << "cnt: " << cnt << endl;
            sleep(1);
            cnt--;
        }
        exit(0);    // 子进程退出
    }

    // father进程代码段
    int status = 0;
    // 等待指定子进程结束并获取退出状态
    pid_t rid = waitpid(id, &status, 0);
    if(rid == id)
    {
        // 打印子进程退出信息:
        // status>>8 & 0xFF: 获取退出码
        // status & 0x7F: 获取导致进程终止的信号编号
        // (status>>7) & 1: 是否产生core dump文件
        cout << "child quit info, rid: " << rid << " exit code: " << 
            ((status>>8)&0xFF) << " exit signal: " << (status&0x7F) <<
                " core dump: " << ((status>>7)&1) << endl;
    }
    */
}






/* 以下是被注释掉的信号处理相关代码
void work()
{
    cout << "print log..." << endl;
}

// 信号处理函数
void handler(int signo)
{
    // work();
    cout << "...get a sig, number: " << signo <<endl;
    // exit(1);
    int n = alarm(5);    // 设置新的闹钟
    cout << "剩余时间：" << n << endl;  // 打印原闹钟的剩余时间
}

int main()
{
    // 注册SIGALRM信号的处理函数
    signal(SIGALRM, handler);
    int n = alarm(50);   // 设置50秒的闹钟

    // 主循环
    while(1)
    {
        cout << "proc is running..., pid: " << getpid() << endl;
        sleep(1);
    }

    /* 
    以下是一些错误测试代码:
    - SIGSEGV(段错误)信号处理
    - 无效的文件描述符读取
    - 空指针解引用
    - 除零错误
    */
    /*
    signal(SIGSEGV, handler);
    cout << "point error before" << endl;

    sleep(5);
    char buffer[1024];
    int n =1024;
    n = read(4, buffer, n);    // 读取无效的文件描述符
    printf("n=%d\n", n);
    perror("read");
    // int *p = nullptr;
    // *p = 100;  // 空指针解引用

    // int a = 10;
    // a /= 0; // 除零错误
    cout << "point error before" << endl;
    sleep(1);

    return 0;
}
*/
